package com.ie.common.http;

import lombok.Data;

import java.util.Map;

/**
 * @classname: ResponseResult
 * @Author: royxu
 * @Description: 定义了一个泛型类。泛型类允许你在定义类时指定一个或多个类型参数，这样在创建类的实例时可以指定具体的类型，
 * 这个类通常用于封装服务器返回的数据，包括状态码、消息和具体的数据。使用泛型可以使得这个类能够处理不同类型的数据，而不需要为每种数据类型定义不同的类。
 * <a href="https://blog.csdn.net/m0_64720511/article/details/124271866">...</a>
 * @Date: 2025/4/17  7:39
 * @Param: 泛型参数：<T> 表示这是一个泛型类，T 是类型参数，可以在创建类的实例时指定具体的类型。
 * @version: 1.0
 **/
@Data
public class ResponseResult<T> {

    //	存储操作结果的数据
    private T result;
    /**
     * 表示操作的状态码
     * C200:正常
     * C401:认证不通过
     * C404:未找到资源
     * C405:权限不足
     * C500:服务异常
     */
    private StatusCode statusCode;
    /**
     * 消息的唯一标识符
     * msgId类型,系统里用到的A001，A002,A003
     * A000:
     * BUser：验证码错误
     * A001: 失败
     * AUser:用户名错误
     * BUser:
     * login：邮箱已存在
     * register：验证码正确但邮箱错误
     * GoodsType：
     * 商品类型添加成功
     * 修改成功
     * 有关联删除失败
     * A002: 成功
     * AUser：密码错误
     * BUser:
     * register：注册成功
     * login：密码错误
     * GoodsType:
     * 商品类型添加失败
     * 修改失败
     * 删除成功
     * A003:不存在，失败
     * Buser：邮箱不存在但注册失败
     * GoodsType:删除失败
     */
    private String msgId;
    //	存储消息参数的键值对映射
    private Map<String, String> msgParams;
    //	表示结果类型,主要用于反馈操作结果及状态信息
    private ResultType resultType;

    public ResponseResult() {
    }

    public ResponseResult(T result, String msgId, ResultType rt, StatusCode statusCode, Map<String, String> msgParams) {
        super();
        this.result = result;
        this.msgId = msgId;
        this.resultType = rt;
        this.statusCode = statusCode;
        this.msgParams = msgParams;
    }
    // 重载ResponseResult方法

    /**
     * @Description: 操作正常返回
     * @Author: xujia
     * @Date: 2024/9/10  22:59
     * @Param: [res]
     * @version: 1.0
     * @Return: com.ie.common.http.ResponseResult<T>
     **/
    public static <T> ResponseResult<T> getSuccessResult(T res) {
        return new ResponseResult<T>(res, null, ResultType.SUCCESS, StatusCode.C200, null);
    }

    /**
     * @Description: //TODO
     * @Author: xujia
     * @Date: 2024/9/3  22:23
     * @Param: [res, msgId]
     * @version: 1.0
     * @Return: com.ie.common.http.ResponseResult<T>
     **/
    public static <T> ResponseResult<T> getMessageResult(T res, String msgId) {
        return new ResponseResult<T>(res, msgId, ResultType.MESSAGE, StatusCode.C200, null);
    }

    /**
     * @Description: //TODO
     * @Author: xujia
     * @Date: 2024/9/10  22:59
     * @Param: [res, msgId, statusCode]
     * @version: 1.0
     * @Return: com.ie.common.http.ResponseResult<T>
     **/
    public static <T> ResponseResult<T> getMessageResult(T res, String msgId, StatusCode statusCode) {
        return new ResponseResult<T>(res, msgId, ResultType.MESSAGE, statusCode, null);
    }

    // 如下方法都已定义但未在系统中使用
    public static <T> ResponseResult<T> getSuccessResult(T res, String msgId, Map<String, String> msgParams) {
        return new ResponseResult<T>(res, msgId, ResultType.SUCCESS, StatusCode.C200, msgParams);
    }

    public static <T> ResponseResult<T> getMessageResult(T res, String msgId, Map<String, String> msgParams) {
        return new ResponseResult<T>(res, msgId, ResultType.MESSAGE, StatusCode.C200, msgParams);
    }

    public static <T> ResponseResult<T> getMessageResult(T res, String msgId, Map<String, String> msgParams, StatusCode statusCode) {
        return new ResponseResult<T>(res, msgId, ResultType.MESSAGE, statusCode, msgParams);
    }

    public static <T> ResponseResult<T> getErrorResult(String msgId) {
        return new ResponseResult<T>(null, msgId, ResultType.ERROR, StatusCode.C500, null);
    }

    public static <T> ResponseResult<T> getNotFoundResult() {
        return new ResponseResult<T>(null, null, ResultType.NOT_FOUND, StatusCode.C500, null);
    }
}
